package com.platform.metamodel;

import org.apache.metamodel.BatchUpdateScript;
import org.apache.metamodel.UpdateScript;
import org.apache.metamodel.data.Row;
import org.apache.metamodel.insert.InsertInto;
import org.apache.metamodel.schema.Table;
import org.apache.metamodel.update.RowUpdationBuilder;
import org.apache.metamodel.update.Update;

import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * @author liujizheng
 * @version 1.0
 * @ClassName JdbcBatchExecutor
 * @Description jdbc 批量执行器
 * @date 2021/8/9 15:22
 */
public final class JdbcBatchExecutor {

    /**
     * 批量执行
     *
     * @param scripts     待执行数据
     * @return
     */
    public static UpdateScript execute(Collection<UpdateScript> scripts) {
        return (BatchUpdateScript) callback -> scripts.forEach(script -> script.run(callback));
    }

    /**
     * 批量执行
     *
     * @param scripts     待执行数据
     * @return
     */
    public static UpdateScript execute(UpdateScript... scripts) {
        return (BatchUpdateScript) callback -> Arrays.stream(scripts).forEach(script -> script.run(callback));
    }

    /**
     * 批量插入
     *
     * @param intos       待插入数据
     * @return
     *
     * @see #execute(Collection)
     */
    @Deprecated
    public static UpdateScript insert(Collection<InsertInto> intos) {
        return (BatchUpdateScript) callback -> intos.forEach(into -> into.run(callback));
    }

    /**
     * 批量插入
     *
     * @param schemaName  方案或数据库名
     * @param tableName   数据表名
     * @param rows        待插入数据
     * @return
     *
     */
    public static UpdateScript insert(String schemaName, String tableName, List<Row> rows) {
        return (BatchUpdateScript) callback -> rows.forEach(row -> callback.insertInto(schemaName, tableName).like(row).execute());
    }

    /**
     * 批量插入
     *
     * @param table   数据表
     * @param rows    待插入数据
     * @return
     */
    public static UpdateScript insert(Table table, List<Row> rows) {
        return (BatchUpdateScript) callback -> rows.forEach(row -> callback.insertInto(table).like(row).execute());
    }

    /**
     * 批量更新
     *
     * @param updates     待更新数据
     * @return
     *
     * @see #execute(Collection)
     */
    @Deprecated
    public static UpdateScript update(Collection<Update> updates) {
        return (BatchUpdateScript) callback -> updates.forEach(update -> update.run(callback));
    }


    /**
     * 根据某个条件更新数据
     *
     * @param schemaName  方案或数据库名
     * @param tableName   数据表名
     * @param rows        待更新数据
     * @param columnName  条件字段
     * @param value       条件值
     * @return
     */
    @Deprecated
    public static UpdateScript updateById(String schemaName, String tableName, Collection<Map<String, Object>> rows, String columnName, Object value) {
        return (BatchUpdateScript) callback -> {
            RowUpdationBuilder builder = callback.update(schemaName, tableName);
            rows.forEach(row -> row.forEach(builder::value));
            builder.where(columnName).eq(value);
            builder.execute();
        };
    }

    /**
     * 根据ID批量删除，ID默认名称为id
     *
     * @param schemaName  方案或数据库名
     * @param tableName   数据表名
     * @param ids         id 集合
     * @return
     */
    @Deprecated
    public static UpdateScript deleteById(String schemaName, String tableName, List<Object> ids) {
        return deleteById(schemaName, tableName, "id", ids);
    }

    /**
     * 根据字段名称批量删除
     *
     * @param schemaName  方案或数据库名
     * @param tableName   数据表名
     * @param columnName  字段名称
     * @param ids         id 集合
     * @return
     */
    @Deprecated
    public static UpdateScript deleteById(String schemaName, String tableName, String columnName, List<Object> ids) {
        return (BatchUpdateScript) callback -> ids.forEach(id -> callback.deleteFrom(schemaName, tableName).where(columnName).eq(id).execute());
    }
}
